<?php
/**
 * Корневой обьект, через статические методы реализующий инициализацию системных компонент
 * Он отвечает за все системные сигналы
 * Особенность в том, что в случае сбоя в любом из обработчиков роутинг всегда останавливается
 * 
 * Signals:
 * 
 * 
 */


require_once('agplatform_routing.php');


 class AGPlatform_Core
 {
	static public $profiler = null; //PQP
	static public $console = null; //PQP
	
	/**
	 * Отдельные методы отвечают за разные сигналы
	 */
	
	/**
	 * основной системный сигнал для инициализации
	 * @signal: sys_init
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_Init($param = null)
	{
		set_include_path(get_include_path() . PATH_SEPARATOR . './inc/lib');
		
		require_once('Zend/Loader/Autoloader.php');
		
		$loader = Zend_Loader_Autoloader::getInstance();
		
		//регистрируем неймспейсы
		$loader->registerNamespace('AGPsource'); //для основных классов
		$loader->registerNamespace('Game'); //для игровых классов
		$loader->registerNamespace('Test'); //для тестирования
		
		Zend_Registry::set('loader', $loader);
		
		//корректировка даты
		$param = AGPlatform_Routing::getInstance()->getCurrentParam();
		$conf = $param['config']['Timesync'];
		date_default_timezone_set($conf['use_default_timezone']);
	} 
	
	
	/**
	 * Старт перехвата контроля вывода и использования сжатия
	 * Внимание. Не использовать header() если используется перехват вывода и сжатие
	 * @signal: sys_output_start
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_Output_Start($param = null)
	{
		if ($param['config']['Performance']['use_ob_handler'] == '1')
		{
			//Лог через firephp доступен только если есть буферизация вывода
			$ajax_log = new Zend_Log();
	 	    $ajax_log->addWriter(new Zend_Log_Writer_Firebug());			
			
			$request = new Zend_Controller_Request_Http();
			$response = new Zend_Controller_Response_Http();
			$channel = Zend_Wildfire_Channel_HttpHeaders::getInstance();
			$channel->setRequest($request);
			$channel->setResponse($response);
			
			Zend_Registry::getInstance()->set('firephp_channel', $channel);
			Zend_Registry::getInstance()->set('firephp_response', $response);
				
			$ajax_log->log('FirePHP logging are start!', Zend_Log::INFO);			
			
			Zend_Registry::getInstance()->set('ajax_log', $ajax_log); 			
			
			if ($param['config']['Performance']['use_ob_gzip_compress'] == '1')
			{
				ob_start('ob_gzhandler');
			}
			else
				{
					ob_start();
				}
		}
	}
	
	
	/**
	 * Собирает информацию о клиенте и проверяет, если надо, требования
	 * @signal sys_getbrowserinfo
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_GetClientBrowser_Info($param = null)
	{
		$config = $param['config'];
		
		if ($config['ClientInfo']['use_browsercap_module'] === '1')
		{
			include_once('inc/lib/Browscap/Browscap.php');
			
			$x_tmp = new Browscap('tmp/browsercap_cache');
			$x_tmp->localFile = './tmp/browsercap_cache/php_browscap.ini';
			$x_tmp->cacheFilename = 'cache.php';
			
			if ($config['ClientInfo']['use_autoupdate_browsercap_info'] == '1')
			{
				//использовать автообновление, снижает производительность
				$x_tmp->doAutoUpdate = true;
				$x_tmp->updateMethod = 'socket'; // cURL, socket, URL-wrapper, 
			}
			else
			{
				$x_tmp->doAutoUpdate = false;
				$x_tmp->updateMethod = 'local';
			}
				
				
			if ($config['ClientInfo']['use_silent_mode'] === '1')
			{
				$x_tmp->silent = true;
			}
			
			//!TODO: реализовать  use_logged_browsercap_data
			
			//получаем информацию.
			$browser = $x_tmp->getBrowser();
			
			//записать ее в сессию и в параметр
			if (Zend_Registry::getInstance()->isRegistered('session') === TRUE)
			{
				Zend_Registry::getInstance()->get('session')->__set('browser_info', $browser);			
			}
			
			AGPlatform_Routing::getInstance()->setParamEntity('browser_info', $browser);
			
		}
	}
	
	
	/**
	 * Проверка требований к браузеру клиента
	 * @signal  sys_checkbrowserinfo
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_CheckClientBrowser($param = null)
	{
		$config = $param['config'];
		
		if (($config['ClientInfo']['use_browsercap_module'] === '1') && 
		    ($config['ClientInfo_Requirments']['check_browser_requirments'] === '1'))
		{
			if (isset($param['browser_info']))
			{
				//проверяем параметры
				
				if (($config['ClientInfo_Requirments']['block_crawlers'] == '1') && 
				    (isset($param['browser_info']->Crawler)) && ($param['browser_info']->Crawler == TRUE))
				{
					die('WebCrawler are blocked to access this content');
				}
				
				/* проверять название браузера (пока не поддерживается)  */

				
				if (($config['ClientInfo_Requirments']['block_mobile_browser'] == '1') && 
				    (isset($param['browser_info']->isMobileDevice)) && ($param['browser_info']->isMobileDevice == TRUE))
				{
					die('Mobile browser and device are unsupported at now.');
				}
				
				//проверяем зависимости
				if (($config['ClientInfo_Requirments']['b_requirments_js'] == '1') && 
				    ((!isset($param['browser_info']->JavaScript)) || ($param['browser_info']->JavaScript == FALSE)))
				{
					AGPlatform_Routing::getInstance()->emit('sys_exception', 'You need enable support JavaScript in your browser');
				}
				
				if (($config['ClientInfo_Requirments']['b_requirments_css'] == '1') && 
				    ((!isset($param['browser_info']->supportsCSS)) || ($param['browser_info']->supportsCSS == FALSE)))
				{
					AGPlatform_Routing::getInstance()->emit('sys_exception', 'You need enable support CSS in your browser');
				}				
				
				if (($config['ClientInfo_Requirments']['b_requirments_javaapplet'] == '1') && 
				    ((!isset($param['browser_info']->JavaApplets)) || ($param['browser_info']->JavaApplets == FALSE)))
				{
					AGPlatform_Routing::getInstance()->emit('sys_exception', 'You need enable support Java applets in your browser');
				}
				
				if (($config['ClientInfo_Requirments']['b_requirments_activex'] == '1') && 
				    ((!isset($param['browser_info']->ActiveXControls)) || ($param['browser_info']->ActiveXControls == FALSE)))
				{
					AGPlatform_Routing::getInstance()->emit('sys_exception', 'You need enable support ActiveX Controls in your browser');
				}				
				
				if (($config['ClientInfo_Requirments']['b_requirments_frame'] == '1') && 
				    ((!isset($param['browser_info']->Frames)) || ($param['browser_info']->Frames == FALSE)) && 
					((!isset($param['browser_info']->IFrames)) || ($param['browser_info']->IFrames == FALSE)) )
					
				{
					AGPlatform_Routing::getInstance()->emit('sys_exception', 'You need enable support Frame and IFrame in your browser');
				}					
				
		
			}
		}
	}

	
	/**
	 * Стоп перехвата контроля вывода и использования сжатия, вывод в браузер
	 * Внимание. Не использовать header() если используется перехват вывода и сжатие
	 * это должен быть последний сигнал!
	 * @signal: sys_output_stop
	 * @return 
	 * @param object $param[optional]
	 */	
	static public function _Platform_Output_Stop($param = null)
	{
		if ($param['config']['Performance']['use_ob_handler'] == '1')
		{
			if (Zend_Registry::isRegistered('ajax_log'))
			{
				Zend_Registry::getInstance()->get('firephp_channel')->flush();;
				Zend_Registry::getInstance()->get('firephp_response')->sendHeaders();
			}		
			
			ob_end_flush();
		}
	}
	
	
	/**
	 * Консоль для отладки
	 * @signal sys_pqp_start
	 * @return 
	 * @param object $param[optional]
	 * @param object $option[optional]
	 */
    static public function _Platform_PQP_Start($param = null, $option = null)
	{
		include_once('./inc/lib/PQP/classes/PhpQuickProfiler.php');
		
		AGPlatform_Core::$profiler = new PhpQuickProfiler(PhpQuickProfiler::getMicroTime2(), '/inc/lib/PQP/');
		
		AGPlatform_Core::$console = new Console();
	
		AGPlatform_Core::$console->logMemory('PQP start');
		AGPlatform_Core::$console->logSpeed();
		
		

	}
	
	
	/**
	 * Вывод консоли для отладки
	 * @signal sys_pqp_stop
	 * @return 
	 * @param object $param[optional]
	 * @param object $option[optional]
	 */
	static public function _Platform_PQP_Stop($param = null, $option = null)
	{
		AGPlatform_Core::$console->logMemory();
		AGPlatform_Core::$console->logSpeed();
		
		
		AGPlatform_Core::$profiler->display();
	}
	
	
	/**
	 * Используется для старта измерения производительности
	 * @signal: sys_pm_start
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_PerfomanceMeter_Start($param = null)
	{
		require_once('./inc/lib/DMPM/class.Dm_PerfomanceMeter.php');
	
		$__Timer = new Dm_PerfomanceMeter();

		// start!
		$__Timer->start(); 		
		
		Zend_Registry::getInstance()->set('PerformanceMeter', $__Timer);
	}
	
	/**
	 * Ставит метку отсчета времени, требует параметра pmCheckpintMark
	 * безопасно для вызова без настроек (будет проигнорировано)
	 * @signal sys_pm_chekpoint
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_PerfomanceMeter_Checkpoint($param = null)
	{
		if ((!empty($param)) && (isset($param['pmCheckpointMark'])) && (!empty($param['pmCheckpointMark'])))
		{
			if (Zend_Registry::isRegistered('PerformanceMeter'))
			{
				if ($param['config']['Performance']['use_platform_performance_counter'] == '1')
				{
					Zend_Registry::getInstance()->get('PerformanceMeter')->checkPoint($param['pmCheckpointMark']);
					
					//теперь обнулить параметр
					AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', null);
				} 
			}
		}
	}
	
	/**
	 * Используется для остановки измерений и вывода, если указано в настройках 
	 * @signal: sys_pm_stop
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_PerfomanceMeter_Stop($param = null)
	{
		if (Zend_Registry::isRegistered('PerformanceMeter'))
		{
			$_timer = Zend_Registry::getInstance()->get('PerformanceMeter');
			
			$_timer->stop();
			
			//на случай, если вызивали но не измеряли ничего
			if (empty($_timer->checkpoints)) return false;
				
			
			if ($param['config']['Logging']['use_bootstrap_log'] == '1')
			{
				//запишем в лог
				$_timer->logResults($param['config']['Logging']['log_default_path'] . '/bootstrap_logX.txt');		
			}
			
			if ($param['config']['Performance']['use_verbose_performance_counter'] == '1')
			{
				//echo "<!--\r\n";
				$_timer->showResults();
				//echo "\r\n-->\r\n";		
			}
			
			unset($_timer);	
		}
	}	
	
	
	
	/**
	 * Используется для проверки лицензии 
	 * Внимание! Этот обработчик прерывает безусловно работу приложения в случае отрицательного результата проверки
	 * @signal: sys_license_check
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_License_Check($param = null)
	{
		 $config = $param['config'];
		 
		 //проверка лицензии
		 if ((($config['Licensing']['autocheck_lic'] == 'yes') && (isset($config['Licensing']['lic_path']))) || 
		    ( (isset($config['Licensing']['lic_path'])) && 
			  ($config['Licensing']['autocheck_lic'] == 'probability') && 
			  ((rand(0, 100)) < $config['Licensing']['lic_probability_check'] )
			)) 
		 {
		 	// замер производительности
		 	if ($config['Performance']['use_platform_performance_counter'] == '1') 
			{
				AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start license checking');
				//емит сигнала для измерения
				AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');
			}
		 
			//
			include_once('./inc/lib/PADL/class.license.lib.php');
			include_once('./inc/lib/PADL/class.license.app.php');
			include_once('./inc/lib/PADL/app.lang.php');
			
			$server_array = $_SERVER;
			
			// требует mcrypt 
			$application = new license_application($config['Licensing']['lic_path'], false, true, false, true);
			
			$application->set_server_vars($server_array);
			
			$results = $application->validate();
			
			$application->make_secure();
			//=====
			
			# switch through the results
			switch($results['RESULT'])
			{
				case 'OK' :
					$result 		= 'ok';
					$message 		= $LANG['LICENSE_OK'];
					break;
				case 'TMINUS' :
					$result 		= 'tminus';
					$message 		= str_replace(array('{[DATE_START]}', '{[DATE_END]}'), array($results['DATE']['HUMAN']['START'], $results['DATE']['HUMAN']['END']), $LANG['LICENSE_TMINUS']);
					break;
				case 'EXPIRED' :
					$result 		= 'expired';
					$message 		= str_replace(array('{[DATE_START]}', '{[DATE_END]}'), array($results['DATE']['HUMAN']['START'], $results['DATE']['HUMAN']['END']), $LANG['LICENSE_EXPIRED']);
					break;
				case 'ILLEGAL' :
					$result 		= 'illegal';
					$message 		= $LANG['LICENSE_ILLEGAL'];
					break;
				case 'ILLEGAL_LOCAL' :
					$result 		= 'illegal';
					$message 		= $LANG['LICENSE_ILLEGAL_LOCAL'];
					break;
				case 'INVALID' :
					$result 		= 'invalid';
					$message 		= $LANG['LICENSE_INVALID'];
					break;
				case 'EMPTY' :
					$result 		= 'empty';
					$message 		= $LANG['LICENSE_EMPTY'];
					if(defined('write_error')) $message = $LANG['WRITE_ERROR'].$message;
					break;
				default :
					break;
			}
			
			if ($result != 'ok')
			{
				# template base64'd
				$template = "PGhlYWQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvcmVzb3VyY2VzL2Nzcy9wYWRsX2xpY2Vuc2Vfc3R5bGVzLmNzcyIgLz4KPC9oZWFkPgo8Ym9keSBsZWZ0bWFyZ2luPSIwIiB0b3BtYXJnaW49IjAiPgo8dGFibGUgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGFsaWduPSJjZW50ZXIiPgogICAgICAgIDx0ciBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+CiAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+CiAgICAgICAgICAgICAgICA8ZGl2IGFsaWduPSJjZW50ZXIiPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iNjAwIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBoZWlnaHQ9IjIzIiBjb2xzcGFuPSI1IiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1nL3BhZGwvcmVzdWx0c190b3AuZ2lmIiB3aWR0aD0iNjAwIiBoZWlnaHQ9IjIzIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMiIgaGVpZ2h0PSI1MyIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltZy9wYWRsL3Jlc3VsdHNfbGVmdC5naWYiIHdpZHRoPSIyMiIgaGVpZ2h0PSI1MyIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjU5IiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1nL3BhZGwvcmVzdWx0c19hbGVydC5naWYiIHdpZHRoPSI1OSIgaGVpZ2h0PSI1MyIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltZy9wYWRsL3Jlc3VsdHNfe1tSRVNVTFRdfS5naWYiIHdpZHRoPSI0OTciIGhlaWdodD0iNTMiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHdpZHRoPSIyMiIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSIvcmVzb3VyY2VzL2ltZy9wYWRsL3Jlc3VsdHNfcmlnaHQuZ2lmIiB3aWR0aD0iMjIiIGhlaWdodD0iNTMiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PSIyNyIgdmFsaWduPSJ0b3AiIGJhY2tncm91bmQ9Ii9yZXNvdXJjZXMvaW1nL3BhZGwvcmVzdWx0c19sZWZ0LmdpZiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1nL3BhZGwvc3BhY2VyLmdpZiIgd2lkdGg9IjIyIiBoZWlnaHQ9IjI3IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIyIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9Ii9yZXNvdXJjZXMvaW1nL3BhZGwvc3BhY2VyLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjI3IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNTQxIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7W01FU1NBR0VdfSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBiYWNrZ3JvdW5kPSIvcmVzb3VyY2VzL2ltZy9wYWRsL3Jlc3VsdHNfcmlnaHQuZ2lmIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL3Jlc291cmNlcy9pbWcvcGFkbC9zcGFjZXIuZ2lmIiB3aWR0aD0iMjIiIGhlaWdodD0iMjciIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgaGVpZ2h0PSIxMDQiIGNvbHNwYW49IjUiIHZhbGlnbj0idG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0iL3Jlc291cmNlcy9pbWcvcGFkbC9yZXN1bHRzX2JvdHRvbS5naWYiIHdpZHRoPSI2MDAiIGhlaWdodD0iMTA0IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgPC90cj4KICAgIDwvdGFibGU+CjwvYm9keT4=";
				
				# get the template, assign the vars and output
				die(str_replace(array('{[RESULT]}', '{[MESSAGE]}'), array($result, $message), base64_decode($template)));
			}
		
		 }
 
	}
	
	
	
	/**
	 * Инициализация сессий (дефолтный неймспейс)
	 * @signal sys_session_start
	 * @return 
	 * @param object $param[optional]
	 */
 	static public function _Platform_Session_Start($param = null)
	{
		 if ($param['config']['Performance']['use_platform_performance_counter'] == '1') 
		 {
		 	AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start PHP session init');
			//емит сигнала для измерения
			AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');
		 }
		 
		 //!TODO: инициализация других неймспейсов если надо
		 $def_session = new Zend_Session_Namespace('Default');
 
 		 Zend_Registry::getInstance()->set('session', $def_session); 
	}


    /**
     * Инциализация списков действий ACL, используя методы connectManager-ов
     * @signal sys_acl
     * @return 
     * @param object $param[optional]
     */
	static public function _Platform_Acl($param = null)
	{
		// замер производительности
		if ($param['config']['Performance']['use_platform_performance_counter'] == '1') 
		{
			AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start ACL building');
			//емит сигнала для измерения
			AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');
		}
		
		//для улучшения производительности мы напрямую подключаем компоненты
		require_once 'inc/lib/Zend/Acl.php';
		require_once 'inc/lib/Zend/Acl/Role.php';
		
			
		//проверим кеширование
		if (($param['config']['Performance']['use_cached_acl'] == TRUE) && 
		    (file_exists('tmp/acl_cache/acl_full.cache') == TRUE))
		{
			
			$acl = unserialize(file_get_contents('tmp/acl_cache/acl_full.cache'));
			
			Zend_Registry::getInstance()->set('acl', $acl); 
		}
		else
		{		
		
			//создаем основной класс
			Zend_Registry::getInstance()->set('acl', new Zend_Acl()); 
			
			//теперь вызвать все методы для собирания ACL-а
			Platform_connectManager::exportACL(Zend_Registry::getInstance()->get('acl'));
			AGPsource_connectManager::exportACL(Zend_Registry::getInstance()->get('acl'));
			Game_connectManager::exportACL(Zend_Registry::getInstance()->get('acl'));
		
			
			if ($param['config']['Performance']['use_cached_acl'] == TRUE)
			{
				//закешируем обьект
				$acl_cache = serialize(Zend_Registry::getInstance()->get('acl'));
				
				file_put_contents('tmp/acl_cache/acl_full.cache', $acl_cache);
			}
		}
	}



    /**
     * Инциализация списков действий ACL из базы (устаревший метод)
     * @signal sys_acl_db
     * Внимание, требует доступа к базе данных, поэтому требует сигнала sys_db, которы эмитирует самостоятельно
     * @return 
     * @param object $param[optional]
     */
	static public function _Platform_Acl_DB($param = null)
	{
		// замер производительности
		if ($param['config']['Performance']['use_platform_performance_counter'] == '1') 
		{
			AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start ACL building');
			//емит сигнала для измерения
			AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');
		}
		
		if (Zend_Registry::getInstance()->isRegistered('db') == FALSE)
		{
			AGPlatform_Routing::getInstance()->emit('sys_db');		
		}
		
		$db = Zend_Registry::getInstance()->get('db');
		
		//создаем основной класс
		$acl = new Zend_Acl();
		
		//можно загрузить все ресурсы с базы
		$sql = 'SELECT res_name, parent_res_name FROM system_acl_resources WHERE is_used != \'no\' ';
		
		if ($result = $db->query($sql))
		{
			while ($row = $result->fetch_assoc())
			{
				if ($acl->has($row['res_name'])) continue;
				
				if ((isset($row['parent_res_name'])) && (!empty($row['parent_res_name'])) && ($acl->has($row['parent_res_name'])))
				{
					$acl->add(new Zend_Acl_Resource($row['res_name']), $row['parent_res_name']);
				}
				else
					{
						$acl->add(new Zend_Acl_Resource($row['res_name']));
					}
    		}
			
			$result->close();
		} 
		else
			AGPlatform_Routing::getInstance()->emit('sys_exception', 'No resources in DB stored');
		
		
		// теперь выбрать всю иерархию ролей и загрузить ее.
		// Для ролей наследования определено их вес, чем он меньше, тем ниже в дереве будет роль (сортировка по убыванию)
		$sql = 'SELECT 
						r1.role_name AS main_role_name,
						r2.role_name AS parent_role_name,
						system_acl_role_structure.parent_role_weight AS parent_role_weight 		
		
		        FROM
					system_acl_role_base r1, system_acl_role_base r2, system_acl_role_structure
				WHERE
					system_acl_role_structure.base_role_id = r1.role_id
				AND
					r2.role_id = system_acl_role_structure.parent_role_id					
					
				ORDER BY parent_role_weight ASC, main_role_name ';
		
		
		if ($result = $db->query($sql))
		{
			$tmp = Array(); //Array('role' => '', 'parents' => Array() );
			
			while ($row = $result->fetch_assoc())
			{
				// если роль зависит от самой себя, значит ни от кого :)
				if ($row['main_role_name'] == $row['parent_role_name'])
				{
					if ($acl->hasRole($row['main_role_name']) === FALSE)
					{
						$acl->addRole(new Zend_Acl_Role($row['main_role_name']));
					}
					
					continue;
				}
				else
					{
						$tmp[$row['main_role_name']][] = $row['parent_role_name'];
						
						continue;
					}
			}
			
			$result->close();
		}
		
		//перебирем все роли
		// Ограничимся двумя уровнями вложенности
		//!TODO: сделать полноценное хранение для любой вложенности
		foreach ($tmp as $role => $parents_role)
		{
			//в парентах есть два типа ролей - простые (уже добавленные) и комплексные (имеют в свою очередь парентов)
			foreach ($parents_role as $n_role)
			{
				if (array_key_exists($n_role, $tmp) === TRUE) // наша роль - комплексная
				{
					//но все, что лежат в ее основе роли - должны быть уже добавлены, так как основные (из-за ограничения на вложеность)
					// значит наша роль - имеет первый уровень вложености и базируется на основных ролях
					// $acl->addRole(new Zend_Acl_Role($row['main_role_name']));
					if ($acl->hasRole($n_role) === FALSE)
					{
						//добавим роль
						$acl->addRole(new Zend_Acl_Role($n_role), $tmp[$n_role]);
						continue;
					}					
				}
			}
			
			if ($acl->hasRole($role) === FALSE)
			{
				//добавим роль
				$acl->addRole(new Zend_Acl_Role($role), $parents_role);
				continue;
			}
		}
		
		//теперь, когда все есть, запрашиваем разрешения и запреты ролям/ресурсам
		$sql = 'SELECT 
					restrict_action,
					system_acl_role_base.role_name AS role_name,
					system_acl_resources.res_name AS res_name,
					system_acl_actions.act_name AS act_name
				FROM
					system_acl_rights, system_acl_role_base, system_acl_resources, system_acl_actions
				WHERE
					system_acl_role_base.role_id = system_acl_rights.role_id
				AND
					system_acl_resources.acl_rid = system_acl_rights.res_id 
				AND
					system_acl_actions.act_id = system_acl_rights.act_id  ';
		
		if ($result = $db->query($sql))
		{
			while ($row = $result->fetch_assoc())
			{
				if ($row['restrict_action'] == 'allow')
				{
					$acl->allow($row['role_name'], $row['res_name'], $row['act_name']);
				}
				else
					$acl->deny($row['role_name'], $row['res_name'], $row['act_name']);
		
			}
			
			$result->close();
		}

		Zend_Registry::getInstance()->set('acl', $acl);
	}



 	
    /**
     * Проверяет, все ли компоненты есть, модули и версия РНР
     * Внимание! Автоматически прерывает выполнение, если чего-то нет.
     * @signal sys_requirments_check
     * @return 
     * @param object $param[optional]
     */
    static public function _Platform_Requirments_Check($param = null)
	{
		 $config = $param['config'];
		 
		 if ($config['Requirments']['autocheck'] == '1')
		 {
		 	// замер производительности
		     if ($param['config']['Performance']['use_platform_performance_counter'] == '1') 
		 	 {
		 		AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start requirments checking');
				//емит сигнала для измерения
				AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');
		 	 }
			
			
			if (version_compare(PHP_VERSION, $config['Requirments']['php_version'])  == -1)
			{
				AGPlatform_Routing::getInstance()->emit('sys_exception','Sorry, AGP Platform running only when PHP version is 5.2.0 or hight. Please, check your version ('.PHP_VERSION.') and upgrade it.');
			}
			
			$_installed = get_loaded_extensions();
		
		    $_can_running = true;
			
			foreach ($config['Requirments']['php_ext'] as $i=>$ext)
			{
				if (in_array($ext, $_installed) === FALSE)
				{
					$_can_running = false;
					AGPlatform_Routing::getInstance()->emit('sys_exception','Sorry, for running AGPsource Game Platform you needed loaded PHP extension: ' . $ext );
				}
			}
			
			if ($_can_running === FALSE)
			{
				AGPlatform_Routing::getInstance()->emit('sys_exception', 'Check requirments for running AGPsource Game Platform');
			}	
		 }
	}
	
	
	
	/**
	 * Вызов проверки безопасности (PHP-IDS)
	 * @signal sys_security_ids_check
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_SecurityIDS_Check($param = null)
	{
		$config = $param['config'];
		
		//попробуем вероятностный сканнер
		$sec_check_p = rand(0, 100);
		 
		//проверка безопасности
		 if (($config['PHPIDS']['autocheck_ids'] == "yes") || 
		    (($config['PHPIDS']['autocheck_ids'] == "probability") && ($sec_check_p < (int)$config['PHPIDS']['phpids_probability_check'])))
		 {
		 	 if ($param['config']['Performance']['use_platform_performance_counter'] == '1') 
		 	 {
		 		AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start PHP-IDS security ceck');
				//емит сигнала для измерения
				AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');
		 	 }
			 
			 
			 
			 //!TODO: обработать исключения из trusted_url_mask	 
			 require_once 'IDS/Init.php';
			 
			 try 
			 {
				 //что проверяем в PHPIDS
				 $request = array(
			        'REQUEST' => $_REQUEST,
			        'GET' => $_GET,
			        'POST' => $_POST,
			        'COOKIE' => $_COOKIE
			     );
				 
				 $init = IDS_Init::init('./inc/config/phpids_config.ini');
				 
				 $init->config['General']['base_path'] = './inc/lib/IDS/';
		    	 $init->config['General']['use_base_path'] = true;
				 $init->config['Caching']['caching'] = 'file';
				 $init->config['Caching']['filter_type'] = 'json'; //xml
				 $init->config['Logging']['path'] = $config['PHPIDS']['phpids_alert_log'];
				 
				 
				 if ($config['PHPIDS']['write_ids_alert_to_db'] == '1')
				 {
				 	//пишем в базу данных
					$init->config['Logging']['wrapper'] = $config['PHPIDS']['phpids_wrapper'];
					$init->config['Logging']['user'] = $config['PHPIDS']['phpids_user'];
					$init->config['Logging']['password'] = $config['PHPIDS']['phpids_password'];
					$init->config['Logging']['table'] = $config['PHPIDS']['phpids_table'];
				 }
				 
				 
				 //запускаем проверку
				 $ids = new IDS_Monitor($request, $init);
		    	 $result = $ids->run();
				 
				 //А что результат?
				 if (!$result->isEmpty())
				 {
				 	//echo $result;
					
					require_once 'IDS/Log/File.php';
					
					if ($config['PHPIDS']['write_ids_alert_to_db'] == '1')
				 	{
				 		require_once 'IDS/Log/Database.php';
					}
					
		        	require_once 'IDS/Log/Composite.php';
		
		        	$compositeLog = new IDS_Log_Composite();
		        	$compositeLog->addLogger(IDS_Log_File::getInstance($init));
					
					if ($config['PHPIDS']['write_ids_alert_to_db'] == '1')
				 	{
				 		$compositeLog->addLogger(IDS_Log_Database::getInstance($init));
					}
					
					//записали в лог безопасности
					$compositeLog->execute($result);
					
					@header('Location: ' . $config['PHPIDS']['if_attack_detected']);
					exit;			
				 }
			 }
			 catch (Exception $e)
			 {
			 	AGPlatform_Routing::getInstance()->emit('sys_exception', 'Some error while secyrity check: ' . $e->getMessage());
			 }
			 
		 }
 		
	}
	
	
	
	
	/**
	 * Инициализация шаблонизатора
	 * @signal sys_templates
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_Template($param = null)
	{
		$config = $param['config'];
		
		 //Инициализация шаблонизатора (Template Lite)
	     if ($param['config']['Performance']['use_platform_performance_counter'] == '1') 
	 	 {
	 		AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start Tpl init checking');
			//емит сигнала для измерения
			AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');
	 	 }		
		 
		 
		 require_once('./inc/lib/TemplateLite/src/class.template.php');
		 
		 $tpl = new Template_Lite;
		 
		 $tpl->compile_dir = './tmp/tpl_compiled/';//$_SERVER["DOCUMENT_ROOT"] . "/tmp/tpl_compiled/";
		 $tpl->template_dir = './resources/tpl_src/';//$_SERVER["DOCUMENT_ROOT"] . "/resources/tpl_src/";
		 $tpl->cache_dir = './tmp/tpl_cached/';//$_SERVER["DOCUMENT_ROOT"] . "/tmp/tpl_cached/";
		 
		 $tpl->left_delimiter = '{';
		 $tpl->right_delimiter = '}';
		 
		 //включим кеширование
		 if ($config['Templates']['tpl_cache'] == '1')
		 {
		 	 $tpl->cache = true;
		 }
		 else
		 	 $tpl->cache = false;
		
		 //время жизни кешированых шаблонов
		 $tpl->cache_lifetime = (int)$config['Templates']['tpl_cache_lifetime'];
		 
		 if ($config['Templates']['tpl_force_compile'] == '1')
		 {
		 	$tpl->force_compile = true; 	
		 }
		 else
		 	$tpl->force_compile = false;
		 
		 if ($config['Templates']['tpl_debugging'] == '1')
		 {
		 	$tpl->force_compile = true; 	
		 }
		 else
		 	$tpl->force_compile = false;
		 
		 
		 if (is_object($tpl) == false)
		 {
		 	//die('Error: Template engine not created');
			AGPlatform_Routing::getInstance()->emit('sys_exception', 'Error: Template engine not created');
		 }
		 else
		 	{
		 		//сохраним в реестре
				Zend_Registry::getInstance()->set('tpl', $tpl);
		 	}
	}
	
	
	/**
	 * Инициализация логов согласно конфигу
	 * @signal sys_logs
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_Log($param = null)
	{
		 if ($param['config']['Performance']['use_platform_performance_counter'] == '1') 
	 	 {
	 		AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start Log subsystem init');
			//емит сигнала для измерения
			AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');
	 	 }

		 foreach ($param['config']['Logging']['log_type'] as $i=>$_log)
		 {
		 	$log = new Zend_Log();
			$log->addWriter(new Zend_Log_Writer_Stream($param['config']['Logging']['log_default_path'] . '/' .  $_log . '_log.txt'));
			
			Zend_Registry::getInstance()->set($_log . '_log', $log); 
		 }
		 
		 
 
	}
	
	
	
	/**
	 * Инициализация быстрого кеша в RAM (XCache, APC)
	 * @signal  sys_fast_cache
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_FastCache($param = null)
	{
		$config = $param['config'];
		
		if ($config['Cache']['fast_cache_type'] == 'Xcache')
		 {
		 	$backendOptions = array(
				'user' => $config['Cache']['fast_xcache_user'],
				'password' => $config['Cache']['fast_xcache_password']
			);
		 }
		 else
		 	{
		 		$backendOptions = array();
		 	}
		 
		  
		 $cache = Zend_Cache::factory('Core',
		                              $config['Cache']['fast_cache_type'],
									   array(
											'caching' => $config['Cache']['use_fast_cache'],
											'cache_id_prefix' => 'agp_',
											'lifetime' => $config['Cache']['fast_cache_lifetime'],
											'logging' => false,
											'write_сontrol' => false,
											'automatic_serialization' => true,
											'automatic_cleaning_factor' => 10,
											'ignore_user_abort' => true									
									 	),
									  $backendOptions);
		
		 
		 Zend_Registry::getInstance()->set('fast_cache', $cache); 		
	}
	
	
	/**
	 * Инициализация основного кеша, файлового
	 * @signal sys_file_cache
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_FileCache($param = null)
	{
		 $config = $param['config'];
		 
		 $fcache = Zend_Cache::factory('Core',
                               'File',
							   array(
									'caching' => $config['Cache']['use_file_cache'],
									'cache_id_prefix' => 'agp_',
									'lifetime' => $config['Cache']['file_cache_lifetime'],
									'logging' => false,
									'write_сontrol' => $config['Cache']['file_cache_writecontrol'],
									'automatic_serialization' => true,
									'automatic_cleaning_factor' => 10,
									'ignore_user_abort' => true									
							 	),
							   array(
							  	    'cache_dir' => $config['Cache']['file_cache_path'],
									'file_locking' => false,
									'read_control' => true,
									'read_control_type' => 'crc32',
									'hashed_directory_level' => 1,
									'file_name_prefix' => 'agp_cache'
							  ));
 
 		Zend_Registry::getInstance()->set('file_cache', $fcache); 
 
	}
	
	/**
	 * Инициализация кеша в Memcached
	 * @signal sys_memcached_cache
	 * Внимание! Если нет подключения, безусловно прерывает программу
	 * @return 
	 * @param object $param[optional]
	 * @todo implements in RC2
	 */
	static public function _Platform_Mem_Cache($param = null)
	{
		//!TODO: использовать memcached, добавить конфигурацию в config.ini
		//throw new AGPlatform_StopRouting_Signal_Exception();
		AGPlatform_Routing::getInstance()->emit('sys_exception', 'No Memcached adapter implements');
	}
	
	
	/**
	 * Инициализация базы данных (Mysqli)
	 * @signal  sys_db
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_Db($param = null)
	{
		if (Zend_Registry::getInstance()->isRegistered('db')) return; 
		
		$config = $param['config'];

		
		if ($param['config']['Performance']['use_platform_performance_counter'] == '1') 
		{
			AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start  DB connection init');
			//емит сигнала для измерения
			AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');		
		}
		 
		 if ($config['Database']['db_type'] == 'mysql')
		 {
		 	//опции, специфичные для подключения
			$options = array(
		    	Zend_Db::AUTO_QUOTE_IDENTIFIERS => true,
				Zend_Db::ALLOW_SERIALIZATION => true,
				Zend_Db::AUTO_RECONNECT_ON_UNSERIALIZE => true
			);
			
			$db = new Zend_Db_Adapter_Mysqli(array(
			    'host'     => $config['Database']['db_host'],
			    'username' => $config['Database']['db_user'],
			    'password' => $config['Database']['db_password'],
			    'dbname'   => $config['Database']['db_database_name'],
				'port' => $config['Database']['db_port']			
			));
			
			if ((!is_object($db)) || ($db == FALSE))
			{
				AGPlatform_Routing::getInstance()->emit('sys_exception', 'AGPsource Platform required DB connection to start. Error: ' . mysqli_connect_error());
			}
			
			if (mysqli_connect_errno())
			{
				AGPlatform_Routing::getInstance()->emit('sys_exception', 'AGPsource Platform required DB connection to start. Error: ' . mysqli_connect_error());
			}
			
			$db_conn = $db->getConnection(); //соединение
		    
			if ($config['Database']['db_setup_utf8'] == '1')
			{
				//Мы работем ТОЛЬКО с UTF-8 кодировкой
				mysqli_set_charset($db_conn, 'utf8');
			}
			
			//подключаем профайлер запросов
			if ((Zend_Registry::isRegistered('ajax_log')) && ($config['Database']['use_firephp_profiler'] == TRUE))  
			{
				$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
				$profiler->setEnabled(true);
		
				$db->setProfiler($profiler);
			}
						
			//добавляем в реестр
			Zend_Registry::getInstance()->set('db', $db_conn); // для совместимости
			
			Zend_Registry::getInstance()->set('dbo', $db); //обьектный интерфейс 			
		 }
	}
	
	
	/**
	 * Инициализация почтовой системы
	 * @signal sys_mail
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_Mail($param = null)
	{
		$config = $param['config'];
		
		if ($param['config']['Performance']['use_platform_performance_counter'] == '1') 
        {
			AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start Mail module init');
			//емит сигнала для измерения
			AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');		
		}
 
		  if ($config['Mail']['use_mail_system'] == 'mail')
		  {
		  		// используется стандартная функция mail 
		 		$mail = new Zend_Mail();
		 
				 if (is_object($mail))
				 {
				 	Zend_Registry::getInstance()->set('mail', $mail);
				 }
		  }
		  else
		  if ($config['Mail']['use_mail_system'] == 'smtp')
		  {
		  	 require_once 'Zend/Mail/Transport/Smtp.php';
		
		     $mail = new Zend_Mail();
			 
			 Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Smtp($config['Mail']['mail_smtp_host']));
			 
			 if (is_object($mail))
			 {
			 	Zend_Registry::getInstance()->set('mail', $mail);
			 }
		  }
		 
	}
	
	
	
	/**
	 * Генерирует обьект для сервиса ReCaptcha
	 * @signal sys_recaptcha
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_Captcha_ReCaptcha($param = null)
	{
		if ($param['config']['Performance']['use_platform_performance_counter'] == '1') 
        {
			AGPlatform_Routing::getInstance()->setParamEntity('pmCheckpointMark', 'Start ReCaptcha service init');
			//емит сигнала для измерения
			AGPlatform_Routing::getInstance()->emit('sys_pm_chekpoint');		
		}
		
		$config = $param['config'];
		
		if (($config['Captcha']['use_recaptcha_service'] == '1') && 
		    (!empty($config['Captcha']['recaptcha_public_key'])) && (!empty($config['Captcha']['recaptcha_private_key'])))
		{
			$recaptcha = new Zend_Service_ReCaptcha($config['Captcha']['recaptcha_public_key'], $config['Captcha']['recaptcha_private_key']);
	
			//добавляем в реестр
			Zend_Registry::getInstance()->set('recaptcha', $recaptcha);
		}	
	}
	
	/**
	 * Инициализация RedisDB сервера (клиента к серверу)
	 * @signal sys_redis
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_Redis($param = null)
	{
		 if ($param['config']['Redis_Server']['use_redis'] == '1')
		 {
		 	require_once('./lib/Redis/Redis_Server.php');
		 
		    $redis = new Redis_Server($param['config']['Redis_Server']['redis_host'],
			                          $param['config']['Redis_Server']['redis_port'],
									  30,
									  true);
			
			//сохраним в реестре
			Zend_Registry::getInstance()->set('redis', $redis); 
	
 		} 		
	}
	
	static public function _Platform_TimeServer($param = null)
	{
		$ntp_server = new Zend_TimeSync($param['config']['Timesync']['ntp_server_pool']);
		var_dump($ntp_server);
		
		var_dump($ntp_server->getDate()->getIso());
	}
	
	
	
	/**
	 * Готовит локализацию для использования
	 * @signal: sys_locale_init
	 * Может требовать файлового кеша (сам этитит если надо)
	 * @return bool
	 * @param object $param[optional]
	 * @param object $options[optional]
	 */	
	static public function _Platform_LocalesInit($param = null, $options = null)
	{
		$config = $param['config'];
		
		//если указано использование кеша
		if ($config['Locale']['use_locale_cache'] == true)
		{
			if (!Zend_Registry::getInstance()->isRegistered('sys_file_cache'))
			{
				if (!in_array('sys_file_cache', $config['signals']))
				{
					//нет сигнала
					//!TODO: добавить функцию автоопределения есть ли сигнал ДО текущего
					AGPlatform_Routing::getInstance()->emit('sys_file_cache');	
				}
			}
			
			//кеш для перевода
			$cache = Zend_Registry::getInstance()->get('file_cache');
			
			//добавим кеш
			Zend_Translate::setCache($cache);
		}
		
		
		//опции для механизма перевода
		$options = Array(
			'disableNotices' => true,
			'log' => Zend_Registry::getInstance()->get('default_log'),
			'logUntranslated' => true,
			'clear' => false		
		);
		
		$path_to = '.' . $config['Locale']['path_to_locales'] . '/' . $config['Locale']['default_locale_file'];
		
		$translate = new Zend_Translate('tmx', $path_to, $config['Locale']['default_locale'], $options);
		$translate->setLocale($config['Locale']['default_locale']);
		
		//все добавим
		Zend_Registry::getInstance()->set('local', $translate);
		
		return true;		
	}
	
	/**
	 * служебный сигнал, устанавливающий локаль (через опциональный параметр)
	 * @signal: sys_locale_set
	 * 
	 * @return bool
	 */
	static public function _Platform_LocalesSet($param = null, $options = null)
	{
		if ((empty($options)) || (!isset($options['locale'])))
		{
			$locale = $param['config']['Locale']['default_locale'];
		}
		else
			{
				$locale = $options['locale'];
			}
			
		
		if (!Zend_Registry::getInstance()->isRegistered('local'))
		{
			AGPlatform_Routing::getInstance()->emit('sys_locale_init');
		}
				
		//проверим, доступен ли язык
		$translator = Zend_Registry::getInstance()->get('local');
		
		if (!$translator->isAvailable($locale))
		{
			//если нет то всеравно дефолтный
			$locale = $param['config']['Locale']['default_locale'];
		}
		
		//установим		
		$translator->setLocale($locale);
		
	    //AGPlatform_Routing::getInstance()->emit('sys_exception', null, array('Locales: ' . $locale . ' not available'));
		
		return true;			
	}
	
	
	
	/**
	 * Специальный обработчик, принимает как параметр строку, генерирует исключение для остановки роутинга
	 * @signal sys_exception
	 * @return 
	 * @param object $param[optional]
	 */
	static public function _Platform_Exception($param = null, $options = null)
	{
		if (Zend_Registry::isRegistered('ajax_log'))
		{
			$log = Zend_Registry::getInstance()->get('ajax_log');
		
			$log->log('sys_exception emited!', Zend_Log::INFO);
			$log->log($param, Zend_Log::INFO);		
			$log->log($options, Zend_Log::INFO);	
		}
		
		
		//echo $param;
		//throw new AGPlatform_StopRouting_Signal_Exception($param);
	}
	
	
 }

 
 
 
 
 
 
 
 
 
 